<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="d7ipv" id="d7ipv"><span data-lake-id="udc829d46" id="udc829d46" style="color: rgb(51, 51, 51)">典型回答</span></h1>
  <p data-lake-id="uc462d9b9" id="uc462d9b9"><br></p>
  <p data-lake-id="uab9d19f0" id="uab9d19f0" style="text-align: justify"><span data-lake-id="u18559485" id="u18559485" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">购物车系统的主要功能，是在用户选购商品之后，下单之前，先把用户的意向商品、数量等信息保存下来，方便用户进行统一的支付。</span></p>
  <p data-lake-id="ub04cf079" id="ub04cf079" style="text-align: justify"><span data-lake-id="u66751ef2" id="u66751ef2" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">​</span><br></p>
  <p data-lake-id="u578af59f" id="u578af59f" style="text-align: justify"><span data-lake-id="u1cf377a6" id="u1cf377a6" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">对于购物车的操作主要就是加入购物车、查看购物车以及通过购物车下单等 。</span></p>
  <p data-lake-id="ub314e825" id="ub314e825" style="text-align: justify"><span data-lake-id="u1dea85ae" id="u1dea85ae" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">​</span><br></p>
  <p data-lake-id="ua5a5c401" id="ua5a5c401" style="text-align: justify"><span data-lake-id="u89290f58" id="u89290f58" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">一般，我们在存储的时候，并不需要把商品的所有信息都保存下来，只需要保存一个SKUID就行了，然后再加上数量、时间等字段即可。</span></p>
  <p data-lake-id="ua6626aef" id="ua6626aef" style="text-align: justify"><span data-lake-id="u58b8fd08" id="u58b8fd08" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">​</span><br></p>
  <p data-lake-id="ue82b7af8" id="ue82b7af8" style="text-align: justify"><span data-lake-id="u902ad281" id="u902ad281" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">至于商品的库存、价格、介绍等信息，只需要在渲染购物车的时候实时反查和计算就行了。</span></p>
  <p data-lake-id="u79b525be" id="u79b525be" style="text-align: justify"><br></p>
  <h2 data-lake-id="C6FLI" id="C6FLI"><span data-lake-id="u556f8e4c" id="u556f8e4c">未登录用户购物车</span></h2>
  <p data-lake-id="u17586281" id="u17586281"><br></p>
  <p data-lake-id="u17f43734" id="u17f43734"><span data-lake-id="u7562a42d" id="u7562a42d" class="lake-fontsize-12">对于电商平台来说，用户一般有登录和未登录两种状态，一般购物车功能需要同时支持已登录用户的加购和未登录用户的加购。</span></p>
  <p data-lake-id="uc48b8f1f" id="uc48b8f1f"><span data-lake-id="u287c10a5" id="u287c10a5" class="lake-fontsize-12">​</span><br></p>
  <p data-lake-id="u6d478c98" id="u6d478c98"><span data-lake-id="u973db4c9" id="u973db4c9" class="lake-fontsize-12">而已登录和未登录的用户的购物车数据的存储其实是不同的。</span></p>
  <p data-lake-id="u56ae2874" id="u56ae2874"><span data-lake-id="ue737fb3f" id="ue737fb3f" class="lake-fontsize-12">​</span><br></p>
  <p data-lake-id="uff1921cd" id="uff1921cd"><span data-lake-id="u4d15ab4b" id="u4d15ab4b" class="lake-fontsize-12">对于未登录的用户，其实他的购物车的信息没必要存储在后端，只需要在客户端做临时缓存就行了。客户端存储可以选择</span><span data-lake-id="uf225f486" id="uf225f486" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">Cookie 和 LocalStorage等技术。</span></p>
  <p data-lake-id="u410768ed" id="u410768ed" style="text-align: justify"><br></p>
  <p data-lake-id="u6327e555" id="u6327e555" style="text-align: justify"><span data-lake-id="u121cc71c" id="u121cc71c" class="lake-fontsize-12">在存储时，只需要设计一个JSON格式就可以了，因为用户没登录，所以也就不需要标识数据属于谁，那么只需要如下存储即可：</span></p>
  <p data-lake-id="u99af42ce" id="u99af42ce" style="text-align: justify"><span data-lake-id="u28519e4a" id="u28519e4a" class="lake-fontsize-12">​</span><br></p>
  <pre lang="java"><code>
{
    "cart": [
        {
            "SKUID": 10086,
            "timestamp": 1666513990,
            "count": 2
        },
        {
            "SKUID": 10010,
            "timestamp": 1666513990,
            "count": 10
        }
    ]
}
 
</code></pre>
  <p data-lake-id="u68812f4c" id="u68812f4c"><span data-lake-id="u10e6ad92" id="u10e6ad92" class="lake-fontsize-12" style="color: rgba(255, 255, 255, 0.3); background-color: rgb(40, 44, 52)"><br><br></span></p>
  <h2 data-lake-id="RrHJw" id="RrHJw"><span data-lake-id="u3cce9a7f" id="u3cce9a7f">已登录用户的购物车</span></h2>
  <p data-lake-id="u07dd75d4" id="u07dd75d4"><br></p>
  <p data-lake-id="u8f9134eb" id="u8f9134eb"><span data-lake-id="uf254f133" id="uf254f133" class="lake-fontsize-12">对于已经登录的用户的购物车，我们就不能存储在客户端了，因为客户端的数据可能会超时、一旦换了设备也就没有了。我们需要用持久化存储，那么就可以使用数据库和Redis缓存。</span></p>
  <p data-lake-id="ucbb845b4" id="ucbb845b4"><br></p>
  <p data-lake-id="u933bf537" id="u933bf537"><span data-lake-id="ue278d478" id="ue278d478" class="lake-fontsize-12">如果是使用数据库，那么就直接建表存储就行了，表中主要需要包含user_id、sku_id、count、time_stamp等几个业务字段就可以了。这样每一个加过购物车的用户都有一条记录。</span></p>
  <p data-lake-id="u4f82eb9e" id="u4f82eb9e"><br></p>
  <p data-lake-id="u7c2e86b5" id="u7c2e86b5"><span data-lake-id="udfbf10ff" id="udfbf10ff" class="lake-fontsize-12">如果使用Redis来保存的话，其实也简单，只需要在上面的未登录用户的购物车的基础上增加一个user_id作为key就行了：</span></p>
  <p data-lake-id="uff5751ef" id="uff5751ef"><span data-lake-id="u5e7b786a" id="u5e7b786a" class="lake-fontsize-12">​</span><br></p>
  <pre lang="java"><code>
{
    "KEY": 12343123,
    "VALUE": [
         {
            "SKUID": 10086,
            "timestamp": 1666513990,
            "count": 2
        },
        {
            "SKUID": 10010,
            "timestamp": 1666513990,
            "count": 10
        }
    ]
}
</code></pre>
  <p data-lake-id="uda29f31a" id="uda29f31a"><strong><span data-lake-id="u98d15797" id="u98d15797" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">​</span></strong><br></p>
  <p data-lake-id="u10e93448" id="u10e93448"><strong><span data-lake-id="u770ce6d7" id="u770ce6d7" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">使用Redis和数据库存储各有好处：</span></strong></p>
  <ol list="u448c7f8d">
   <li fid="ud938b0ca" data-lake-id="ua4d53d13" id="ua4d53d13" style="text-align: justify"><strong><span data-lake-id="u838c7950" id="u838c7950" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">Redis</span></strong><span data-lake-id="u6e505375" id="u6e505375" class="lake-fontsize-12" style="color: rgb(51, 51, 51)"> 性能要比 MySQL 高，</span><strong><span data-lake-id="u381d5225" id="u381d5225" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">响应时间更短，可以支撑更多的并发请求</span></strong><span data-lake-id="u9778ca7a" id="u9778ca7a" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">​</span></li>
   <li fid="ud938b0ca" data-lake-id="u742a8e33" id="u742a8e33" style="text-align: justify"><strong><span data-lake-id="u007db342" id="u007db342" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">MySQL 的数据可靠性是要好于 Redis 的</span></strong><span data-lake-id="u3ae5a477" id="u3ae5a477" class="lake-fontsize-12" style="color: rgb(51, 51, 51)"> ，因为 Redis 是异步刷盘，如果出现服务器掉电等异常情况，Redis 是有可能会丢数据的。</span></li>
   <li fid="ud938b0ca" data-lake-id="u44b15bcb" id="u44b15bcb" style="text-align: justify"><strong><span data-lake-id="ua44e86e3" id="ua44e86e3" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">MySQL 的另一个优势是，它支持丰富的查询方式和事务机制</span></strong></li>
  </ol>
 </body>
</html>